Ana içeriğe geç

RC ve ARC Yapıları

Çoğu durumda sahiplik gayet açıktır. Kimin neye veya kime sahip olduğunu biliriz. Ancak bazı durumlarda bir değerin birden fazla sahibinin olmasını isteyebiliriz. Örneğin Graph veri yapıları olmaktadır. BKNZ

Rust üzerinde bir değerin birden fazla sahibinin olması için Rc yapılarına sahibiz. Bu yapının açılımı Referance Counting olmaktadır.

RC yapıları box referansı gibi heap üzerinde tutalmaktadır. Bir veriye kaç adet referans yapıldığını sayarak bu verinin halen kullanılıp kullanılmadığını hesaplamaktadır. Doğal olarak bir değere 0 adet referans bulunuyorsa o değer temizlenmektedir.

Bu durumlara ek olarak birde arc yapıları bulunmaktadır. Açılımı Atomic Referance Counter olmkatadır. RC yapıları ile aynı olmaktadır ancak fark olarak thread'ler arasında güvenli bir paylaşımı sağlamaktadır. RC genellikle yeterlidir.

RC yapısında bir pointer oluşturmak için ilk olarak projemize Rc eklenmelidir.

use std::rc::Rc;

Artık kodlarımız içerisinde Rc türünde pointerlar oluşturabiliriz.

let s1 = Rc::new(String::from("Pointer"))

Yapıyı oluşturduğumuza göre .clone() ifadesi ile bu yapıya referans oluşturabiliriz.

let s2 = s1.clone();
let s3 = s2.clone();

Sonrasında çalıştığını kanıtlamak için her birini yazdırabiliriz.

println!("{} {} {}", s1, s2 ,s3); // Pointer Pointer Pointer

Bu örneğimizde String değerimize bağlı 3 adet referans değeri vardır yani Rc 3'e eşittir.

Ayrıca heap üzerinde direkt String tutulduğu için tüm String methodları kullanılabilir.